Urban Hanoi school garden

This report was automatically generated with the R package knitr (version 1.45).

---
title: "School gardens in urban Hanoi"
output:
  html_document:
    selfcontained: true
---
## Error: <text>:8:0: unexpected end of input
## 6: ---
## 7: 
##   ^

We model a decision impact pathway is for school gardens as a general intervention for sustainable children’s food environments in urban Hanoi, Vietnam (Whitney et al. 2024).

Conceptual model of school gardens as an intervention. Should urban Hanoi school boards invest time and money in creating school gardens? Should they invest in formal STEM education as part of these gardens?

Urban Hanoi school garden

Simulation of the school garden intervention options:

# Source our model
source("Garden_Model.R")

# Ensure consistent results with the random number generator
# not for each 'run' of the MC simulation but for 
# consistency each time we run the entire simulation 
set.seed(42)

garden_simulation_results <- mcSimulation(
  estimate = estimate_read_csv("data/inputs_school_garden.csv"),
  model_function = school_garden_function,
  numberOfModelRuns = 1e4, #run 10,000 times
  functionSyntax = "plainNames"
)

The Net Present Value (i.e. current value of the future benefits) of the garden decision options over 5 years of the intervention. For public and private schools the STEM costs are considered to be in the same garden space but with the additional costs and benefits of a full STEM education program. All options are compared to the same years of using the land for something that is not related to the garden, i.e. as a playground or for parking. Here we plot the distribution for the decision and frame the projected NPV.

For public schools:

source("functions/plot_distributions.R")
plot_distributions(mcSimulation_object = garden_simulation_results, 
                                    vars = c("NPV_garden_public_school_inclusive", 
                                             "NPV_garden_STEM_public_school_inclusive"),
                   old_names = c("NPV_garden_public_school_inclusive", "NPV_garden_STEM_public_school_inclusive"),
                   new_names = c("NPV public school passive garden", "NPV public school STEM garden"),
                                    method = 'smooth_simple_overlay', 
                                    base_size = 7, 
                                    x_axis_name = "Comparative NPV outcomes")
plot of chunk plot_dist_public

plot of chunk plot_dist_public

For private schools:

source("functions/plot_distributions.R")
plot_distributions(mcSimulation_object = garden_simulation_results, 
                                    vars = c("NPV_garden_inclusive","NPV_garden_STEM_inclusive"),
                   old_names = c("NPV_garden_inclusive","NPV_garden_STEM_inclusive"),
                   new_names = c("NPV private school passive garden","NPV private school STEM garden"),
                                    method = 'smooth_simple_overlay', 
                                    base_size = 7, 
                                    x_axis_name = "Comparative NPV outcomes")
plot of chunk plot_dist_private

plot of chunk plot_dist_private

The same results again but this time as boxplots:

source("functions/plot_distributions.R")
plot_distributions(mcSimulation_object = garden_simulation_results, 
                   vars = c("NPV_garden_inclusive","NPV_garden_STEM_inclusive", "NPV_garden_public_school_inclusive", "NPV_garden_STEM_public_school_inclusive"),
                   old_names = c("NPV_garden_inclusive","NPV_garden_STEM_inclusive", "NPV_garden_public_school_inclusive", "NPV_garden_STEM_public_school_inclusive"),
                   new_names = c("NPV private school passive garden","NPV private school STEM garden", "NPV public school passive garden", "NPV public school STEM garden"),
                                    method = "boxplot", 
                                    base_size = 11, 
                                    x_axis_name = "Comparative NPV outcomes (million VND)")
plot of chunk plot_boxplot_public_private

plot of chunk plot_boxplot_public_private

ggsave("figures/Fig_5_Boxplots.png", width = 15, height = 8, units = "cm")

As boxplots and distributions for public schools:

source("functions/plot_distributions.R")
plot_distributions(mcSimulation_object = garden_simulation_results, 
                                    vars = c("NPV_garden_public_school_inclusive", "NPV_garden_STEM_public_school_inclusive"),
                   old_names = c("NPV_garden_public_school_inclusive", "NPV_garden_STEM_public_school_inclusive"),
                   new_names = c("NPV public school garden", "NPV public school garden with STEM"),
                                    method = "boxplot_density", 
                                    base_size = 7, 
                                    x_axis_name = "Comparative NPV outcomes")
plot of chunk plot_distboxplot_public

plot of chunk plot_distboxplot_public

As boxplots and distributions for private schools:

source("functions/plot_distributions.R")
plot_distributions(mcSimulation_object = garden_simulation_results, 
                                    vars = c("NPV_garden_inclusive","NPV_garden_STEM_inclusive"),
                   old_names = c("NPV_garden_inclusive","NPV_garden_STEM_inclusive"),
                   new_names = c("NPV private school garden","NPV private school with STEM"),
                                    method = "boxplot_density", 
                                    base_size = 7, 
                                    x_axis_name = "Comparative NPV outcomes")
plot of chunk plot_distboxplot_private

plot of chunk plot_distboxplot_private

Summary of results for the decision

Summary of the NPVs for the passive education garden and STEM options for private schools:

summary(garden_simulation_results$y[1:2]) #"NPV_garden_inclusive"                    "NPV_garden_STEM_inclusive"
##  NPV_garden_inclusive NPV_garden_STEM_inclusive
##  Min.   :-626.7       Min.   :-4189.9          
##  1st Qu.: 731.2       1st Qu.:  229.9          
##  Median :1410.5       Median :  902.1          
##  Mean   :1686.1       Mean   : 1131.3          
##  3rd Qu.:2331.9       3rd Qu.: 1811.4          
##  Max.   :9369.2       Max.   : 8908.8

Summary of the NPVs for the passive education garden and STEM options for public schools:

summary(garden_simulation_results$y[3:4]) #"NPV_garden_public_school_inclusive"      "NPV_garden_STEM_public_school_inclusive"
##  NPV_garden_public_school_inclusive NPV_garden_STEM_public_school_inclusive
##  Min.   :-626.7                     Min.   :-4189.9                        
##  1st Qu.:-220.4                     1st Qu.: -263.2                        
##  Median : 564.9                     Median : -104.7                        
##  Mean   : 926.0                     Mean   :  448.7                        
##  3rd Qu.:1657.3                     3rd Qu.:  940.9                        
##  Max.   :9369.2                     Max.   : 8908.8

Summary of the child health outcomes for private and public schools:

summary(garden_simulation_results$y[10:11]) #"health" "health_STEM" 
##      health        health_STEM    
##  Min.   :   0.0   Min.   :   0.0  
##  1st Qu.: 276.7   1st Qu.: 247.7  
##  Median : 679.5   Median : 560.4  
##  Mean   : 748.0   Mean   : 581.5  
##  3rd Qu.:1090.2   3rd Qu.: 856.8  
##  Max.   :4820.9   Max.   :3787.6

Summary of the biodiversity outcomes for the passive education garden and STEM options for private and public schools:

summary(garden_simulation_results$y[9]) #"biodiversity"
##   biodiversity   
##  Min.   : 0.000  
##  1st Qu.: 3.859  
##  Median :10.044  
##  Mean   :10.170  
##  3rd Qu.:15.241  
##  Max.   :45.257

Summary of costs

Total expected costs for a school garden with and without STEM education:

summary(garden_simulation_results$y[12:13])
##   total_costs      total_costs_STEM
##  Min.   :  87.33   Min.   : 144.7  
##  1st Qu.: 200.66   1st Qu.: 363.0  
##  Median : 433.84   Median : 838.1  
##  Mean   : 398.31   Mean   : 925.7  
##  3rd Qu.: 514.38   3rd Qu.:1245.3  
##  Max.   :1434.71   Max.   :5445.9

First year expected costs for a school garden:

summary(garden_simulation_results$y$Cashflow_garden1)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -571.93  -94.77   12.17   70.31  177.15 1515.85

First year expected costs for a school garden with STEM education:

summary(garden_simulation_results$y$Cashflow_garden_STEM1)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -1057.77  -234.36  -118.60   -73.14    48.95  1417.17

Cash flows

Cash flow plots of the garden option without formal STEM education. These are the expected returns for public and private schools over the intervention.

# Cashflow of the garden option without formal STEM education
# This will be the cost for public and private schools over the intervention. 

source("functions/plot_cashflow.R")
plot_cashflow_garden <- plot_cashflow(mcSimulation_object = garden_simulation_results, 
              cashflow_var_name = "Cashflow_garden", 
              facet_labels = "Passive garden") + 
  theme(legend.position = "none", axis.title.y = element_blank(),
        axis.title.x = element_blank(), 
  axis.text.x = element_blank(),
  axis.ticks = element_blank())  

# Cashflow of the garden option with formal STEM education
source("functions/plot_cashflow.R")
plot_cashflow_STEM <- plot_cashflow(mcSimulation_object = garden_simulation_results, 
              cashflow_var_name = "Cashflow_garden_STEM", 
              facet_labels = "STEM garden")+
  labs(y = "Cashflow (million VND)") 

# # manually share axis label (not a feature of patchwork)
# 
# ylab <- plot_cashflow_garden$labels$y
# plot_cashflow_garden$labels$y <- plot_cashflow_STEM$labels$y <- " "
# 
# h_patch <- plot_cashflow_garden / plot_cashflow_STEM 
# # Use the tag label as a y-axis label
# wrap_elements(h_patch) +
#   labs(tag = "Cashflow") +
#   theme(
#     plot.tag = element_text(size = rel(1), angle = 90),
#     plot.tag.position = "left"
#   )

plot_cashflow_garden / plot_cashflow_STEM
plot of chunk cashflow_garden

plot of chunk cashflow_garden

ggsave("figures/Fig_6_cashflow.png", width=5, height=5) 

Projection to Latent Structures (PLS)

We use Projection to Latent Structures (PLS) model to assess the correlation strength and direction for model variables and outcome variables. The Partial Least Squares is fitted with the orthogonal scores algorithm with pls::plsr.

PLS for private schools:

# For passive education garden option
source("functions/pls_model.R")
pls_result <- pls_model(object = garden_simulation_results,
                resultName = names(garden_simulation_results$y)[1], # the "NPV_garden_inclusive" 
                                ncomp = 1)
# read in the common input table
input_table <- read.csv("data/inputs_school_garden.csv")

label_private_school <- "Private school"

# source the plot function
source("functions/plot_pls.R")

plot_pls_garden <- plot_pls(plsrResults = pls_result, 
                            input_table = input_table, 
                            threshold = 0.9) + 
  theme(legend.position = "none", axis.title.x = element_blank(), 
  axis.text.x = element_blank(),
  axis.ticks = element_blank()) + scale_x_continuous(limits = c(0, 7)) + ggtitle(label_private_school) + 
  annotate(geom="text", x=5, y=1, label="Passive garden")
## Scale for x is already present.
## Adding another scale for x, which will replace the existing scale.
#For school garden with formal STEM education
pls_result_STEM <- pls_model(object = garden_simulation_results,
                  resultName = names(garden_simulation_results$y)[2], # the "NPV_garden_STEM" 
                                ncomp = 1)

plot_pls_STEM <- plot_pls(plsrResults = pls_result_STEM, 
                          input_table = input_table, 
                          threshold = 0.9) + 
  scale_x_continuous(limits = c(0, 7)) + 
  annotate(geom="text", x=5, y=1, label="STEM garden")
## Scale for x is already present.
## Adding another scale for x, which will replace the existing scale.
plot_pls_garden / plot_pls_STEM 
plot of chunk pls_private

plot of chunk pls_private

Interpretation of PLS results for private schools

Garden options for private schools:

source("functions/pls_posthoc.R")
pls_posthoc(plsrResults = pls_result, threshold = 0.9)
## Data: 	X dimension: 10000 75 
## 	Y dimension: 10000 1
## Fit method: oscorespls
## Number of components considered: 1
## TRAINING: % variance explained
##    1 comps
## X    1.383
## y   81.301
## Data: 	X dimension: 10000 75 
## 	Y dimension: 10000 1
## Fit method: oscorespls
## Number of components considered: 1
## TRAINING: % variance explained
##    1 comps
## X    1.383
## y   81.301
## Data: 	X dimension: 10000 75 
## 	Y dimension: 10000 1
## Fit method: oscorespls
## Number of components considered: 1
## TRAINING: % variance explained
##    1 comps
## X    1.383
## y   81.301
## PLS Model Summary:
## Number of Components: 1 
## R-squared Value for Y: 
## % Variance Explained in X: 
## % Variance Explained in Y: 
## 
## Important Variables (VIP > 0.9):
##                                                                    Variable
## if_community_likes                                       if_community_likes
## if_garden_yield_enough                               if_garden_yield_enough
## garden_mental_health_value                       garden_mental_health_value
## child_garden_health_care_savings           child_garden_health_care_savings
## child_garden_school_performance_value child_garden_school_performance_value
## school_event_value                                       school_event_value
## school_event_freq                                         school_event_freq
##                                             VIP Coefficient
## if_community_likes                    3.5253603    479.2210
## if_garden_yield_enough                1.0619201    144.3525
## garden_mental_health_value            1.9322820    262.6654
## child_garden_health_care_savings      2.9159686    396.3831
## child_garden_school_performance_value 0.9179744    124.7851
## school_event_value                    6.0758186    825.9183
## school_event_freq                     3.0970698    421.0012
## $plsrResults
## Partial least squares regression, fitted with the orthogonal scores algorithm.
## Call:
## plsr(formula = y ~ x, ncomp = ncomp, method = "oscorespls", scale = scale)
## 
## $r_squared
## NULL
## 
## $explained_variance_x
## NULL
## 
## $explained_variance_y
## NULL
## 
## $important_vars
##                                                                    Variable
## if_community_likes                                       if_community_likes
## if_garden_yield_enough                               if_garden_yield_enough
## garden_mental_health_value                       garden_mental_health_value
## child_garden_health_care_savings           child_garden_health_care_savings
## child_garden_school_performance_value child_garden_school_performance_value
## school_event_value                                       school_event_value
## school_event_freq                                         school_event_freq
##                                             VIP Coefficient
## if_community_likes                    3.5253603    479.2210
## if_garden_yield_enough                1.0619201    144.3525
## garden_mental_health_value            1.9322820    262.6654
## child_garden_health_care_savings      2.9159686    396.3831
## child_garden_school_performance_value 0.9179744    124.7851
## school_event_value                    6.0758186    825.9183
## school_event_freq                     3.0970698    421.0012

STEM options for private schools:

pls_posthoc(plsrResults = pls_result_STEM, threshold = 0.9)
## Data: 	X dimension: 10000 75 
## 	Y dimension: 10000 1
## Fit method: oscorespls
## Number of components considered: 1
## TRAINING: % variance explained
##    1 comps
## X    1.384
## y   75.043
## Data: 	X dimension: 10000 75 
## 	Y dimension: 10000 1
## Fit method: oscorespls
## Number of components considered: 1
## TRAINING: % variance explained
##    1 comps
## X    1.384
## y   75.043
## Data: 	X dimension: 10000 75 
## 	Y dimension: 10000 1
## Fit method: oscorespls
## Number of components considered: 1
## TRAINING: % variance explained
##    1 comps
## X    1.384
## y   75.043
## PLS Model Summary:
## Number of Components: 1 
## R-squared Value for Y: 
## % Variance Explained in X: 
## % Variance Explained in Y: 
## 
## Important Variables (VIP > 0.9):
##                                                                    Variable
## if_community_likes                                       if_community_likes
## annual_teacher_training                             annual_teacher_training
## garden_mental_health_value                       garden_mental_health_value
## child_STEM_community_engagement_value child_STEM_community_engagement_value
## school_event_value                                       school_event_value
## school_event_freq                                         school_event_freq
##                                            VIP Coefficient
## if_community_likes                    3.620610    490.8368
## annual_teacher_training               2.432690   -329.7935
## garden_mental_health_value            1.934898    262.3091
## child_STEM_community_engagement_value 1.502944    203.7503
## school_event_value                    6.045626    819.5900
## school_event_freq                     3.086564    418.4375
## $plsrResults
## Partial least squares regression, fitted with the orthogonal scores algorithm.
## Call:
## plsr(formula = y ~ x, ncomp = ncomp, method = "oscorespls", scale = scale)
## 
## $r_squared
## NULL
## 
## $explained_variance_x
## NULL
## 
## $explained_variance_y
## NULL
## 
## $important_vars
##                                                                    Variable
## if_community_likes                                       if_community_likes
## annual_teacher_training                             annual_teacher_training
## garden_mental_health_value                       garden_mental_health_value
## child_STEM_community_engagement_value child_STEM_community_engagement_value
## school_event_value                                       school_event_value
## school_event_freq                                         school_event_freq
##                                            VIP Coefficient
## if_community_likes                    3.620610    490.8368
## annual_teacher_training               2.432690   -329.7935
## garden_mental_health_value            1.934898    262.3091
## child_STEM_community_engagement_value 1.502944    203.7503
## school_event_value                    6.045626    819.5900
## school_event_freq                     3.086564    418.4375

PLS for public schools:

# For passive education garden option
source("functions/pls_model.R")

pls_result_garden_public <- pls_model(object = garden_simulation_results,
                resultName = names(garden_simulation_results$y)[3], 
                # "NPV_garden_public_school" 
                                ncomp = 1)
# read in the common input table
input_table <- read.csv("data/inputs_school_garden.csv")

label_public_school <- "Public school"

# source the plot function
source("functions/plot_pls.R")
plot_pls_garden_public <- plot_pls(pls_result_garden_public, 
                            input_table = input_table, threshold = 0.9) +
  theme(legend.position = "none", axis.title.x = element_blank(), 
  axis.text.x = element_blank(),
  axis.ticks = element_blank()) + 
  scale_x_continuous(limits = c(0, 7)) + ggtitle(label_public_school) + 
  annotate(geom="text", x=5, y=1, label="Passive garden")
## Scale for x is already present.
## Adding another scale for x, which will replace the existing scale.
#For school garden with formal STEM education
pls_result_STEM_public <- pls_model(object = garden_simulation_results,
                  resultName = names(garden_simulation_results$y)[4], 
                  # "NPV_garden_STEM_public_school"
                                ncomp = 1)

plot_pls_public_STEM <- plot_pls(pls_result_STEM_public, 
                                 input_table = input_table, threshold = 0.9) + scale_x_continuous(limits = c(0, 7)) + 
  annotate(geom="text", x=5, y=1, label="STEM garden")
## Scale for x is already present.
## Adding another scale for x, which will replace the existing scale.
plot_pls_garden_public / plot_pls_public_STEM 
plot of chunk pls_public

plot of chunk pls_public

Interpretation of PLS results for public schools

Garden option in public school:

pls_posthoc(plsrResults = pls_result_garden_public, threshold = 0.9)
## Data: 	X dimension: 10000 75 
## 	Y dimension: 10000 1
## Fit method: oscorespls
## Number of components considered: 1
## TRAINING: % variance explained
##    1 comps
## X    1.379
## y   35.120
## Data: 	X dimension: 10000 75 
## 	Y dimension: 10000 1
## Fit method: oscorespls
## Number of components considered: 1
## TRAINING: % variance explained
##    1 comps
## X    1.379
## y   35.120
## Data: 	X dimension: 10000 75 
## 	Y dimension: 10000 1
## Fit method: oscorespls
## Number of components considered: 1
## TRAINING: % variance explained
##    1 comps
## X    1.379
## y   35.120
## PLS Model Summary:
## Number of Components: 1 
## R-squared Value for Y: 
## % Variance Explained in X: 
## % Variance Explained in Y: 
## 
## Important Variables (VIP > 0.9):
##                                                          Variable      VIP
## if_community_likes                             if_community_likes 3.223838
## if_garden_yield_enough                     if_garden_yield_enough 1.116363
## garden_mental_health_value             garden_mental_health_value 1.833121
## child_garden_health_care_savings child_garden_health_care_savings 2.809503
## school_event_value                             school_event_value 5.703387
## school_event_freq                               school_event_freq 2.815326
## suitability_of_land_for_garden     suitability_of_land_for_garden 1.788907
## beurocratic_barriers                         beurocratic_barriers 2.270791
##                                  Coefficient
## if_community_likes                  296.7360
## if_garden_yield_enough              102.7549
## garden_mental_health_value          168.7285
## child_garden_health_care_savings    258.5988
## school_event_value                  524.9645
## school_event_freq                   259.1349
## suitability_of_land_for_garden      164.6587
## beurocratic_barriers               -209.0134
## $plsrResults
## Partial least squares regression, fitted with the orthogonal scores algorithm.
## Call:
## plsr(formula = y ~ x, ncomp = ncomp, method = "oscorespls", scale = scale)
## 
## $r_squared
## NULL
## 
## $explained_variance_x
## NULL
## 
## $explained_variance_y
## NULL
## 
## $important_vars
##                                                          Variable      VIP
## if_community_likes                             if_community_likes 3.223838
## if_garden_yield_enough                     if_garden_yield_enough 1.116363
## garden_mental_health_value             garden_mental_health_value 1.833121
## child_garden_health_care_savings child_garden_health_care_savings 2.809503
## school_event_value                             school_event_value 5.703387
## school_event_freq                               school_event_freq 2.815326
## suitability_of_land_for_garden     suitability_of_land_for_garden 1.788907
## beurocratic_barriers                         beurocratic_barriers 2.270791
##                                  Coefficient
## if_community_likes                  296.7360
## if_garden_yield_enough              102.7549
## garden_mental_health_value          168.7285
## child_garden_health_care_savings    258.5988
## school_event_value                  524.9645
## school_event_freq                   259.1349
## suitability_of_land_for_garden      164.6587
## beurocratic_barriers               -209.0134

STEM option in public school:

pls_posthoc(plsrResults = pls_result_STEM_public, threshold = 0.9)
## Data: 	X dimension: 10000 75 
## 	Y dimension: 10000 1
## Fit method: oscorespls
## Number of components considered: 1
## TRAINING: % variance explained
##    1 comps
## X    1.382
## y   45.369
## Data: 	X dimension: 10000 75 
## 	Y dimension: 10000 1
## Fit method: oscorespls
## Number of components considered: 1
## TRAINING: % variance explained
##    1 comps
## X    1.382
## y   45.369
## Data: 	X dimension: 10000 75 
## 	Y dimension: 10000 1
## Fit method: oscorespls
## Number of components considered: 1
## TRAINING: % variance explained
##    1 comps
## X    1.382
## y   45.369
## PLS Model Summary:
## Number of Components: 1 
## R-squared Value for Y: 
## % Variance Explained in X: 
## % Variance Explained in Y: 
## 
## Important Variables (VIP > 0.9):
##                                                                    Variable
## if_community_likes                                       if_community_likes
## if_garden_yield_enough                               if_garden_yield_enough
## annual_teacher_training                             annual_teacher_training
## garden_mental_health_value                       garden_mental_health_value
## child_STEM_community_engagement_value child_STEM_community_engagement_value
## school_event_value                                       school_event_value
## school_event_freq                                         school_event_freq
## suitability_of_land_for_garden               suitability_of_land_for_garden
## beurocratic_barriers                                   beurocratic_barriers
##                                             VIP Coefficient
## if_community_likes                    3.3581740   306.64673
## if_garden_yield_enough                0.9028128    82.43902
## annual_teacher_training               3.2503871  -296.80432
## garden_mental_health_value            1.8132451   165.57381
## child_STEM_community_engagement_value 1.5100019   137.88361
## school_event_value                    5.7352174   523.70295
## school_event_freq                     2.7985316   255.54380
## suitability_of_land_for_garden        1.0977247   100.23712
## beurocratic_barriers                  1.3696563  -125.06815
## $plsrResults
## Partial least squares regression, fitted with the orthogonal scores algorithm.
## Call:
## plsr(formula = y ~ x, ncomp = ncomp, method = "oscorespls", scale = scale)
## 
## $r_squared
## NULL
## 
## $explained_variance_x
## NULL
## 
## $explained_variance_y
## NULL
## 
## $important_vars
##                                                                    Variable
## if_community_likes                                       if_community_likes
## if_garden_yield_enough                               if_garden_yield_enough
## annual_teacher_training                             annual_teacher_training
## garden_mental_health_value                       garden_mental_health_value
## child_STEM_community_engagement_value child_STEM_community_engagement_value
## school_event_value                                       school_event_value
## school_event_freq                                         school_event_freq
## suitability_of_land_for_garden               suitability_of_land_for_garden
## beurocratic_barriers                                   beurocratic_barriers
##                                             VIP Coefficient
## if_community_likes                    3.3581740   306.64673
## if_garden_yield_enough                0.9028128    82.43902
## annual_teacher_training               3.2503871  -296.80432
## garden_mental_health_value            1.8132451   165.57381
## child_STEM_community_engagement_value 1.5100019   137.88361
## school_event_value                    5.7352174   523.70295
## school_event_freq                     2.7985316   255.54380
## suitability_of_land_for_garden        1.0977247   100.23712
## beurocratic_barriers                  1.3696563  -125.06815

Value of Information

Here we assess value of information with the multi_EVPI function. We calculate value of information in the form of Expected Value of Perfect Information (EVPI).

# Subset the outputs from the mcSimulation function (y) by selecting the correct variables be sure to run the multi_EVPI only on the variables that we want. Find them with names(garden_simulation_results$y)
mcSimulation_table <- data.frame(garden_simulation_results$x, 
                                 garden_simulation_results$y[1:4])

# List of NPV variables to move to the last position (calculate 4 EVPIs only)
npvs_to_move <- c("NPV_garden_inclusive", "NPV_garden_STEM_inclusive", 
                  "NPV_garden_public_school_inclusive", "NPV_garden_STEM_public_school_inclusive")

# Move NPV variables to the last position
mcSimulation_table <- mcSimulation_table %>% select(-all_of(npvs_to_move), all_of(npvs_to_move))

Calculate EVPI:

source("functions/multi_EVPI_test.R")
# evpi <- multi_EVPI_test(mc = mcSimulation_table, first_out_var = "NPV_garden_inclusive")
# save as a local .csv (takes ~ 15 minutes to run this)
# save(evpi,file="data/data_evpi.Rda")
 load("data/data_evpi.Rda")
# open from saved file (last model run) - it is stable result / takes very long to run 

EVPI for private schools:

#Value of information the garden intervention decision
  source("functions/plot_evpi.R")
#plot_evpi_garden <- plot_evpi(EVPIresults = evpi, 
  #                             decision_vars = "NPV_garden_inclusive", 
  #                             new_names = "Garden",
  #                           input_table = input_table, 
  #                           threshold = 10) +
  # theme(legend.position = "none", axis.title.x = element_blank(), 
  # axis.text.x = element_blank(),
  # axis.ticks = element_blank()) + 
  # scale_x_continuous(limits = c(0, 210)) + ggtitle(label_private_school) 
# Value of information for the garden option with formal STEM education.
# using the results of the same multi_EVPI
# plot_evpi_STEM <- plot_evpi(EVPIresults = evpi, 
#                             decision_vars = "NPV_garden_STEM_inclusive", 
#                             new_names = "STEM garden",
#                             input_table = input_table, 
#                             threshold = 10) + scale_x_continuous(limits = c(0, 210)) 

# plot_evpi_garden / plot_evpi_STEM

EVPI for public schools:

# Value of information for the public school garden option with no formal STEM education.

# using the results of the same multi_EVPI
# plot_evpi_public <- plot_evpi(evpi, decision_vars = "NPV_garden_public_school_inclusive", 
#                             new_names = "Garden", 
#                             input_table = input_table, 
#                             threshold = 10) +
#   theme(legend.position = "none", axis.title.x = element_blank(), 
#   axis.text.x = element_blank(),
#   axis.ticks = element_blank()) + 
#   scale_x_continuous(limits = c(0, 210)) + ggtitle(label_public_school) #210
# Value of information for the public school garden option with formal STEM education.
# using the results of the same multi_EVPI
plot_evpi_public_STEM <- plot_evpi(evpi, decision_vars = "NPV_garden_STEM_public_school_inclusive", 
                            new_names = "STEM garden",
                            input_table = input_table, 
                            threshold = 10) # + 
#  scale_x_continuous(limits = c(0, 210))  #210
plot_evpi_public_STEM
plot of chunk evpi_public_2

plot of chunk evpi_public_2

# plot_evpi_public / plot_evpi_public_STEM

Pareto-optimal solutions

Our Pareto-optimal solutions represent the best trade-offs among the objectives of biodiversity, child health, and economic return. By focusing on these Pareto-optimal points, the analysis highlights solutions where improvements in one objective cannot be achieved without some compromise in at least one other.

source("pareto/plot_pareto_scenarios.R")
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
## Warning in get_plot_component(plot, "guide-box"): Multiple components found;
## returning the first one. To return all, use `return_all = TRUE`.
final_plot
plot of chunk pareto-optimal

plot of chunk pareto-optimal

# Save the plot
ggsave("figures/Fig_8_pareto_fronts.png", final_plot, width = 10, height = 8, bg = "white")

Controllable variables included:

estimates = read.csv("data/inputs_school_garden.csv")
estimates = estimates[estimates$variable !="", ]

estimates[estimates$control_status == "controllable", ]
##                 variable lower median upper distribution
## 6         size_of_garden   5.0     NA 100.0      posnorm
## 13   if_effective_manage   0.5     NA   0.7    tnorm_0_1
## 17 if_effective_teaching   0.2     NA   0.9    tnorm_0_1
## 18 if_effective_training   0.2     NA   0.8    tnorm_0_1
## 23  if_animals_in_garden   0.2     NA   0.8    tnorm_0_1
## 49 if_school_has_canteen   0.2     NA   0.5    tnorm_0_1
## 85     school_event_freq   3.0     NA  10.0      posnorm
## 88            if_parking   0.1     NA   0.8    tnorm_0_1
##                                                           label control_status
## 6                                 Size of school garden in (m2)   controllable
## 13                    Chance of effective garden management (%)   controllable
## 17         Chance of high education quality / effectiveness (%)   controllable
## 18                Chance of effective training for teachers (%)   controllable
## 23 Chance of school choosing to integrate animals in garden (%)   controllable
## 49                     Chance that the school has a canteen (%)   controllable
## 85                 Number of school events per year (days/year)   controllable
## 88 Chance of including parking on the plot without a garden (%)   controllable

Variables that are considered out of the control of the decision maker included:

estimates[estimates$control_status != "controllable", ]
##                                   variable  lower median  upper distribution
## 1                          number_of_years  5.000     NA   5.00        const
## 2                            discount_rate  3.000     NA   8.00      posnorm
## 3                                 CV_value  0.100     NA   0.40    tnorm_0_1
## 4                           inflation_rate  5.000     NA  10.00      posnorm
## 7                    expensive_garden_size 80.000     NA  95.00      posnorm
## 8      cost_increase_expensive_garden_size  1.010     NA   2.50      posnorm
## 10                        if_students_like  0.500     NA   0.80    tnorm_0_1
## 11                         if_parents_like  0.500     NA   0.90    tnorm_0_1
## 12                      if_community_likes  0.100     NA   0.85    tnorm_0_1
## 14                  if_garden_yield_enough  0.300     NA   0.80    tnorm_0_1
## 15                       if_garden_healthy  0.500     NA   0.90    tnorm_0_1
## 16                        if_teachers_like  0.200     NA   0.90    tnorm_0_1
## 19                    if_offer_green_space  0.500     NA   0.90    tnorm_0_1
## 20                     if_reduce_pollution  0.200     NA   0.50    tnorm_0_1
## 21                     if_biophysical_good  0.200     NA   0.80    tnorm_0_1
## 25                          equipment_cost  6.000     NA  20.00      posnorm
## 26                       construction_cost  6.500     NA 130.50      posnorm
## 27                  garden_designing_costs 10.000     NA  15.00      posnorm
## 28                   teacher_training_cost  5.000     NA  20.00      posnorm
## 29                   school_board_planning  6.000     NA  12.00      posnorm
## 30                      teaching_equipment  5.000     NA  10.00      posnorm
## 31                        compost_starting  5.000     NA  10.00      posnorm
## 32                           worm_starting  3.000     NA  10.00      posnorm
## 33           livestock_establishment_costs  5.000     NA  25.00      posnorm
## 34                           fishpond_cost  7.000     NA  10.00      posnorm
## 36            if_family_pays_establishment  0.200     NA   0.50    tnorm_0_1
## 37       establishment_family_portion_paid  0.200     NA   0.80    tnorm_0_1
## 39                       maintaining_labor 25.000     NA  40.00      posnorm
## 40                     teacher_salary_cost 20.000     NA  30.00      posnorm
## 41               teaching_equipment_annual  1.000     NA  40.00      posnorm
## 42                          teaching_tools  2.000     NA  10.00      posnorm
## 43                              seed_costs  5.000     NA  20.00      posnorm
## 44                              fertilizer  1.000     NA   2.00      posnorm
## 45                        plant_protection  2.000     NA   5.00      posnorm
## 46                         livestock_maint  2.000     NA  10.00      posnorm
## 47                 annual_teacher_training  5.000     NA 276.00      posnorm
## 50                         canteen_savings  1.000     NA   5.00      posnorm
## 51                           sale_of_yield 10.000     NA  30.00      posnorm
## 53                extra_cirricular_savings 20.000     NA 100.00      posnorm
## 54                      formal_edu_savings  1.000     NA   3.00      posnorm
## 55                 formal_edu_savings_STEM 20.000     NA 100.00      posnorm
## 57                outside_investment_value  1.000     NA   5.00      posnorm
## 58           outside_investment_value_STEM  1.000     NA   8.00      posnorm
## 60              increased_enrollment_value  0.100     NA   5.00      posnorm
## 61         increased_enrollment_value_STEM 10.000     NA 100.00      posnorm
## 63           child_veg_health_care_savings  0.100     NA   5.00      posnorm
## 64      child_veg_school_performance_value  0.010     NA   0.20      posnorm
## 65    child_veg_community_engagement_value  0.010     NA   0.10      posnorm
## 67              garden_mental_health_value  4.000     NA 300.00      posnorm
## 69        child_garden_health_care_savings  9.000     NA 500.00      posnorm
## 70   child_garden_school_performance_value 21.000     NA 182.00      posnorm
## 71 child_garden_community_engagement_value  3.000     NA   7.00      posnorm
## 73          child_STEM_health_care_savings 20.000     NA  80.00      posnorm
## 74     child_STEM_school_performance_value  2.000     NA 100.00      posnorm
## 75   child_STEM_community_engagement_value 10.000     NA 250.00      posnorm
## 77                   green_space_eco_value  1.000     NA  10.00      posnorm
## 78                  reduce_pollution_value  1.000     NA   3.00      posnorm
## 79     chance_garden_is_fallow_green_space  0.001     NA   0.05    tnorm_0_1
## 80                    fallow_eco_reduction  0.500     NA   0.80    tnorm_0_1
## 81                green_space_health_value  1.000     NA  10.00      posnorm
## 82                 fallow_health_reduction  0.500     NA   0.80    tnorm_0_1
## 84                      school_event_value 10.000     NA 200.00      posnorm
## 87            value_of_non_garden_land_use 20.000     NA  50.00      posnorm
## 89                           parking_value  0.100     NA   3.00      posnorm
## 90            costs_of_non_garden_land_use  1.000     NA   5.00      posnorm
## 92                             land_access  0.600     NA   0.95    tnorm_0_1
## 93          suitability_of_land_for_garden  0.600     NA   0.95    tnorm_0_1
## 94                    beurocratic_barriers  0.010     NA   0.50    tnorm_0_1
##                                                                                  label
## 1                                                Number of years for garden simulation
## 2                                                                   Discounting factor
## 3                      Coefficient of variation for our school garden intervention (%)
## 4                                                                   Inflation rate (%)
## 7                       Cut off value for where the garden becomes more expensive (m2)
## 8              Percentage more expensive if garden is beyond the expensive_garden_size
## 10                                                    Chance of student engagement (%)
## 11                                       Chance of parents support / effectiveness (%)
## 12                                                     Chance of community support (%)
## 14                                          Chance of sufficient yield from garden (%)
## 15                                              Chance of healthy food from garden (%)
## 16                                                    Chance of teacher engagement (%)
## 19                       Chance of garden having ecologically valuable green space (%)
## 20                                              Chance of garden reducing polution (%)
## 21                               Chance of biophysical not damaging (i.e. weather) (%)
## 25                              Costs of equipment for setting up garden (million VND)
## 26                           Costs of construction for setting up garden (million VND)
## 27                                       Costs of design team consultant (million VND)
## 28                     Costs of training teachers when setting up garden (million VND)
## 29                                            Costs of planning meetings (million VND)
## 30                                                Equipment for teaching (million VND)
## 31                                                      Starting compost (million VND)
## 32                                            Starting worms for compost (million VND)
## 33                                       Starting animals  in the garden (million VND)
## 34                                     Digging a fish pond in the garden (million VND)
## 36                                    Chance that families donate to establishment (%)
## 37                              Portion of establishment costs donated by families (%)
## 39                       Annual Labor cost to maintain school garden  (million VND/yr)
## 40                                    Additional teacher salary costs (million VND/yr)
## 41                  Teaching equipment / manitaining microscopes etc. (million VND/yr)
## 42                                        Teaching tools / paper etc. (million VND/yr)
## 43                                                Seeds and seedlings (million VND/yr)
## 44                               Fertilizer i.e. EM to add to compost (million VND/yr)
## 45                                  Integrated Pest Managemernt (IPM) (million VND/yr)
## 46                                               Mainitaining animals (million VND/yr)
## 47                                      Mainitaining teacher training (million VND/yr)
## 50                                                    Canteen savings (million VND/yr)
## 51                                           Sales of garden products (million VND/yr)
## 53                          Savings from extra-cirriclar activities (million VND/year)
## 54               Savings on formal education costs (no STEM garden) (million VND/year)
## 55                           Savings on STEM formal education costs (million VND/year)
## 57                     Outside investment value (reputation) garden (million VND/year)
## 58                       Outside investment value (reputation) STEM (million VND/year)
## 60          Increased enrollment/tuition income (reputation) garden (million VND/year)
## 61            Increased enrollment/tuition income (reputation) STEM (million VND/year)
## 63                      Healthcare savings (child) access to garden (million VND/year)
## 64                  School performance (children) eating garden veg (million VND/year)
## 65                Community engagement (children) eating garden veg (million VND/year)
## 67 Mental health value of children/others having a garden at school (million VND/year)
## 69                        Healthcare savings (children) with garden (million VND/year)
## 70                  School performance value (children) with garden (million VND/year)
## 71                Community engagement value (children) with garden (million VND/year)
## 73                        Healthcare savings (children) STEM garden (million VND/year)
## 74                  School performance value (children) STEM garden (million VND/year)
## 75                Community engagement value (children) STEM garden (million VND/year)
## 77                                             Value of green space (million VND/year)
## 78                       Value of reduced polution on school garden (million VND/year)
## 79                              Chance that the garden space is fallow green space (%)
## 80                     Proportion of value of fallow greenspace compared to garden (%)
## 81                 Value of non-garden green space for child health (million VND/year)
## 82    Proportion of value of fallow greenspace for child heatlh compared to garden (%)
## 84                           Value of garden related school events (million VND/event)
## 87                      Value of non garden land use, playground etc. (million VND/yr)
## 89                                       Above table value of parking (million VND/yr)
## 90                                        Cost of non garden land use (million VND/yr)
## 92                                        Chance that the school has acess to land (%)
## 93                                  Chance that the land at the school is suitable (%)
## 94                       Chance that beurocratic barriers will inhibit the process (%)
##    control_status
## 1           const
## 2       uncertain
## 3       uncertain
## 4       uncertain
## 7       uncertain
## 8       uncertain
## 10      uncertain
## 11      uncertain
## 12      uncertain
## 14      uncertain
## 15      uncertain
## 16      uncertain
## 19      uncertain
## 20      uncertain
## 21      uncertain
## 25      uncertain
## 26      uncertain
## 27      uncertain
## 28      uncertain
## 29      uncertain
## 30      uncertain
## 31      uncertain
## 32      uncertain
## 33      uncertain
## 34      uncertain
## 36      uncertain
## 37      uncertain
## 39      uncertain
## 40      uncertain
## 41      uncertain
## 42      uncertain
## 43      uncertain
## 44      uncertain
## 45      uncertain
## 46      uncertain
## 47      uncertain
## 50      uncertain
## 51      uncertain
## 53      uncertain
## 54      uncertain
## 55      uncertain
## 57      uncertain
## 58      uncertain
## 60      uncertain
## 61      uncertain
## 63      uncertain
## 64      uncertain
## 65      uncertain
## 67      uncertain
## 69      uncertain
## 70      uncertain
## 71      uncertain
## 73      uncertain
## 74      uncertain
## 75      uncertain
## 77      uncertain
## 78      uncertain
## 79      uncertain
## 80      uncertain
## 81      uncertain
## 82      uncertain
## 84      uncertain
## 87      uncertain
## 89      uncertain
## 90      uncertain
## 92      uncertain
## 93      uncertain
## 94      uncertain

Summarize objective results for the Pareto

An rmoo::summary of the values resulting from the rmoo::nsga2 minimization of a fitness function using non-dominated sorting genetic algorithms - II (NSGA-IIs). Multiobjective evolutionary algorithms with 500 random draws with the decisionSupport::random 200 100 a population size of 200 and 100 iterations (or ‘generations’ maxiter) in rmoo::nsga2.

Load the results of a multi-objective optimization run with load, including the fitness values and population of solutions. Display the optimal results with rmoo::summary. The final result@fitness contains the fitness values for all solutions in the final generation of the optimization. The rmoo:non_dominated_fronts() identifies which solutions are Pareto-optimal. The sweep Filters the rescaled fitness matrix mat to retain only the Pareto-optimal solutions front1_set indices of Pareto-optimal solutions from mat2 that includes only these Pareto-optimal solutions. For example, if mat2 has 200 rows, but front1_set contains 24 indices, set1 will be a 24×3 matrix.

load(file="data/optimization_results/private_nostem_500_200_100.RData")
#  loads the previously saved result object from an .RData file.
rmoo::summary(result) 
## 
## Summary of NSGA-II run
## #====================================
## Number of Objectives evaluated:  3
## Total iterations:  100
## Population size:  200
## Nondominated points found:  200 (100% of total)
## Crowding distance bounds:  Inf 0
## Mutation Probability:  10%
## Crossover Probability:  80%
## 
## Please install package 'ecr' to calculate IGD and GD.
## 
## Please install package 'emoa' to calculate hypervolume.
## #====================================
mat = result@fitness 
front1_set = rmoo::non_dominated_fronts(result)$fit[[1]]
mat2 = sweep(-mat, 2, c(100, 1, 100) , `*`) # retransform
set1 = mat2[front1_set, ]

Plot of all options

load(file="data/optimization_results/public_nostem_500_200_100.RData")
rmoo::summary(result)
## 
## Summary of NSGA-II run
## #====================================
## Number of Objectives evaluated:  3
## Total iterations:  100
## Population size:  200
## Nondominated points found:  200 (100% of total)
## Crowding distance bounds:  Inf 0
## Mutation Probability:  10%
## Crossover Probability:  80%
## 
## Please install package 'ecr' to calculate IGD and GD.
## 
## Please install package 'emoa' to calculate hypervolume.
## #====================================
mat = result@fitness
front1_set = rmoo::non_dominated_fronts(result)$fit[[1]]
mat2 = sweep(-mat, 2, c(100, 1, 100) , `*`) # retransform
set3 = mat2[front1_set, ]

load(file="data/optimization_results/public_stem_500_200_100.RData")
rmoo::summary(result)
## 
## Summary of NSGA-II run
## #====================================
## Number of Objectives evaluated:  3
## Total iterations:  100
## Population size:  200
## Nondominated points found:  200 (100% of total)
## Crowding distance bounds:  Inf 0
## Mutation Probability:  10%
## Crossover Probability:  80%
## 
## Please install package 'ecr' to calculate IGD and GD.
## 
## Please install package 'emoa' to calculate hypervolume.
## #====================================
mat = result@fitness
front1_set = rmoo::non_dominated_fronts(result)$fit[[1]]
mat2 = sweep(-mat, 2, c(100, 1, 100) , `*`) # retransform
set4 = mat2[front1_set, ]

# Plot Pareto results ####

library(plotly)
library(ggplot2)
library(cowplot)
## 
## Attaching package: 'cowplot'
## The following object is masked from 'package:lubridate':
## 
##     stamp
## The following object is masked from 'package:patchwork':
## 
##     align_plots
## The following object is masked from 'package:gt':
## 
##     as_gtable
pareto_3d_plot <- plot_ly() %>%
  add_trace(x = set1[,1], y = set1[,2], z = set1[,3],
            type = "scatter3d", mode = "markers",
            marker = list(color = 'blue', size = 5),
            name = 'private, no STEM') %>%
  add_trace(x = set2[,1], y = set2[,2], z = set2[,3],
            type = "scatter3d", mode = "markers",
            marker = list(color = 'red', size = 5),
            name = 'private, STEM') %>%
  add_trace(x = set3[,1], y = set3[,2], z = set3[,3],
            type = "scatter3d", mode = "markers",
            marker = list(color = 'green', size = 5),
            name = 'public, no STEM') %>%
  add_trace(x = set4[,1], y = set4[,2], z = set4[,3],
            type = "scatter3d", mode = "markers",
            marker = list(color = 'orange', size = 5),
            name = 'public, STEM') %>%
  layout(scene = list(xaxis = list(title = 'economic'),
                      yaxis = list(title = 'biodiversity'),
                      zaxis = list(title = 'health')))

# pareto_3d_plot

Pareto

Input data for the simulations

Summary

Here we provide a summary of the garden intervention options. We do this with a summary table of the simulation results. We show the percentage of missing values as well as the mean, median and standard deviation (SD) for each output of our model simulations. We use the gt_plt_summary() from {gtExtras} and with options from {svglite}. The table shows the name, the plot overview as well as the number of missing values, the mean, median and the standard deviation of the distribution for all variables that were fed into the model from our input table of uncertainty values.

# Subset the outputs from the mcSimulation function (y) to summarize only on the variables that we want.
# names(garden_simulation_results$x)
mcSimulation_table_x <- data.frame(garden_simulation_results$x[4:7]) #, 21:30, 32:41, 43:70, 73:76)  also of possible interest

 gtExtras::gt_plt_summary(mcSimulation_table_x) 
mcSimulation_table_x
10000 rows x 4 cols
Column Plot Overview Missing Mean Median SD
inflation_rate 214 0.0% 7.5 7.5 1.5
size_of_garden 0183 0.0% 45.7 41.8 29.6
expensive_garden_size 70103 0.0% 87.4 87.5 4.5
cost_increase_expensive_garden_size 0.13.4 0.0% 1.8 1.8 0.4
# a summary table with missing, mean, median and sd

The table shows the variable name, the plot overview as well as the number of missing values, the mean, median and the standard deviation of the distribution for variables that calculated in the model.

The full repository can be accessed at https://github.com/CWWhitney/urban_school_gardens


The R session information (including the OS info, R version and all
packages used):


```r
sessionInfo()
## R version 4.4.2 (2024-10-31)
## Platform: x86_64-redhat-linux-gnu
## Running under: Fedora Linux 40 (Forty)
## 
## Matrix products: default
## BLAS/LAPACK: FlexiBLAS OPENBLAS-OPENMP;  LAPACK version 3.11.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=de_DE.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=de_DE.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=de_DE.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C       
## 
## time zone: Europe/Berlin
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] parallel  stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] cowplot_1.1.3         gridExtra_2.3         RColorBrewer_1.1-3   
##  [4] lubridate_1.9.3       forcats_1.0.0         stringr_1.5.1        
##  [7] dplyr_1.1.4           purrr_1.0.2           readr_2.1.5          
## [10] tidyr_1.3.1           tibble_3.2.1          tidyverse_2.0.0      
## [13] svglite_2.1.3         rPref_1.4.0           plotly_4.10.4        
## [16] ggplot2_3.5.1         patchwork_1.3.0       gtExtras_0.5.0       
## [19] gt_0.11.1             ggstance_0.3.7        decisionSupport_1.114
## [22] akima_0.6-3.4         knitr_1.45           
## 
## loaded via a namespace (and not attached):
##   [1] bitops_1.0-9             rematch2_2.1.2           readxl_1.4.3            
##   [4] rlang_1.1.4              magrittr_2.0.3           compiler_4.4.2          
##   [7] rmoo_0.2.0               systemfonts_1.1.0        vctrs_0.6.5             
##  [10] maps_3.4.2.1             ecmwfr_2.0.2             pkgconfig_2.0.3         
##  [13] crayon_1.5.3             fastmap_1.2.0            backports_1.5.0         
##  [16] labeling_0.4.3           fontawesome_0.5.2        utf8_1.2.4              
##  [19] tzdb_0.4.0               ragg_1.3.3               xfun_0.49               
##  [22] cachem_1.1.0             jsonlite_1.8.9           progress_1.2.3          
##  [25] highr_0.10               broom_1.0.7              rriskDistributions_2.1.2
##  [28] prettyunits_1.2.0        R6_2.5.1                 stringi_1.8.4           
##  [31] car_3.1-3                boot_1.3-31              cellranger_1.1.0        
##  [34] iterators_1.0.14         Rcpp_1.0.13-1            assertthat_0.2.1        
##  [37] fields_16.3              R.utils_2.12.3           igraph_2.1.2            
##  [40] Matrix_1.7-1             splines_4.4.2            timechange_0.3.0        
##  [43] tidyselect_1.2.1         abind_1.4-8              codetools_0.2-20        
##  [46] lattice_0.22-6           withr_3.0.2              evaluate_0.23           
##  [49] survival_3.7-0           RcppParallel_5.1.9       xml2_1.3.6              
##  [52] chillR_0.75              pillar_1.9.0             ggpubr_0.6.0            
##  [55] carData_3.0-5            foreach_1.5.2            checkmate_2.3.2         
##  [58] generics_0.1.3           nleqslv_3.3.5            sp_2.1-4                
##  [61] RCurl_1.98-1.16          metR_0.16.0              paletteer_1.6.0         
##  [64] hms_1.1.3                munsell_0.5.1            scales_1.3.0            
##  [67] mc2d_0.2.1               class_7.3-22             glue_1.8.0              
##  [70] GenSA_1.1.14.1           lazyeval_0.2.2           tools_4.4.2             
##  [73] data.table_1.16.2        ggsignif_0.6.4           mvtnorm_1.3-2           
##  [76] dotCall64_1.2            XML_3.99-0.17            grid_4.4.2              
##  [79] crosstalk_1.2.1          colorspace_2.1-1         eha_2.11.5              
##  [82] GA_3.2.4                 Formula_1.2-5            cli_3.6.3               
##  [85] textshaping_0.4.1        spam_2.11-0              fansi_1.0.6             
##  [88] expm_1.0-0               viridisLite_0.4.2        Kendall_2.2.1           
##  [91] gtable_0.3.6             pls_2.8-5                R.methodsS3_1.8.2       
##  [94] rstatix_0.7.2            sass_0.4.9               digest_0.6.37           
##  [97] msm_1.8.2                htmlwidgets_1.6.4        farver_2.1.2            
## [100] memoise_2.0.1            htmltools_0.5.8.1        R.oo_1.27.0             
## [103] lifecycle_1.0.4          httr_1.4.7
Sys.time()
## [1] "2025-01-02 19:51:54 CET"